/**
 * 函数上下文
在函数上下文中，我们用活动对象(activation object, AO)来表示变量对象。

执行过程
执行上下文的代码会分成两个阶段进行处理：分析和执行，我们也可以叫做：
进入执行上下文
代码执行

进入执行上下文
当进入执行上下文时，这时候还没有执行代码，
变量对象会包括：
函数的所有形参 (如果是函数上下文)
由名称和对应值组成的一个变量对象的属性被创建
没有实参，属性值设为 undefined
函数声明
由名称和对应值（函数对象(function-object)）组成一个变量对象的属性被创建
如果变量对象已经存在相同名称的属性，则完全替换这个属性
变量声明
由名称和对应值（undefined）组成一个变量对象的属性被创建；
如果变量名称跟已经声明的形式参数或函数相同，则变量声明不会干扰已经存在的这类属性
 */

function foo() {
    console.log(a);
    a = 1;
}

foo(); // ReferenceError: a is not defined

function bar() {
    a = 1;
    console.log(a);
}
bar();

